#ifndef  __MY__HOT__
#define  __MY__HOT__
#include <unistd.h>
#include "Util.hpp"
#include "Manager.hpp"

extern Cloude::DataManager* _dataM;

namespace Cloude
{

	/*
		热点管理:
				对非热点管理文件进行压缩存储	
	*/

	using std::cout;
	using std::endl;
	using std::string;
	using std::vector;
	class HotManager
	{

	private:
		size_t _hot_time;
		string _pack_suffix;
		string _pack_dir;
		string _back_dir;
	public:

		HotManager()
		{
			// 加载配置文件的信息
			LoadConfigMessage();

			// 创建备份目录，压缩目录
			Cloude::FileUtil fb(_back_dir);
			fb.CreateDirectory();

			Cloude::FileUtil fp(_pack_dir);
			fp.CreateDirectory();

		}
		void LoadConfigMessage()
		{
			Cloude::Config* config = Cloude::Config::GetInstance();
			_hot_time = config->GetHTime();
			_pack_suffix = config->GetPackSuff();
			_pack_dir = config->GetPackDir();
			_back_dir = config->GetBackDir();
		}
		
		// 判断是否是非热点文件
		bool IsNonHotFile(time_t atime)
		{
			if(time(nullptr) - atime > _hot_time)
			{
				return true;
			}
			return false;
		}

		// 如何获取所有的备份文件信息？
		//			1. 从DataManager中获取
		//			2. 读取备份目录获取
		// 需要采用2方式,因为1方式是静态的，可能自己程序中某些地方并没有更新DataManager导致错误
		// 采用2方法，更安全一点
	
		// 热点管理模块是一个死循环
		bool RunMoudle()
		{
			while(true)
			{
				// 1.从备份目录下获取所有备份文件信息
				Cloude::FileUtil fb(_back_dir);
				// 1.1 获取所有文件
				vector<string> filenames;
				if( fb.ScanDirectory(&filenames) == false)
				{
					cout << "HotManager::ScanDirectory failed.." << endl;
					return false;
				}
				for(int i = 0; i < filenames.size(); i++)
				{
					cout << filenames[i] << endl;
					// 1.2 获取备份信息结构体
					Cloude::BackupInfo info;
					// 使用NewBackupInfo可能不太好，因为DataManager中存在管理的备份文件
					// 我们应该从它里面获取，而不是新建一个BackupInfo
					//info.NewBackupInfo(filenames[i]);
					if(_dataM->GetOneByRealPath(filenames[i],&info) == false)
					{
						// 如果不存在则重新上去
						cout << "HotManager:: " << filenames[i] << "do not exist in DataManager" << endl;
						continue;
					}
					
					// 2.判断是否是非热点文件
					// 最近一次访问时间，从文件属性上获取不要从DataManager中获取
					// 系统维护的更准确
					Cloude::FileUtil f(filenames[i]);

					if(IsNonHotFile(/*info._atime*/ f.GetATime() ))
					{
						// 3.是非热点文件，则需要进行压缩存储
						// ./back_dir/a.txt
						// a.txt
						string filename = f.FileName();
						// a.txt --> ./pack_dir/a.txt.lz   BackupInfo 中存在这个信息
						//string packpath = _pack_dir + filename + _pack_suffix;
						// 3.1 压缩 
						f.Compress(info._pack_path);

						//4.并将原始备份文件删除，修改压缩标志，并更新DataManager对应的BackupInfo
						info._pack_flag = true;
						f.RemoveFile();
						_dataM->Update(info);
					}

				}
				// 防止空目录,一直while(true); 频繁耗费cpu资源
				sleep(1);

				cout << "Hot Manager is running..." << endl;

			}

		}

	
	};
}







#endif
